<?php

if (!function_exists('arr2obj')) {
    /**
     * 数组转对象
     *
     * @param array $arr  要转换的数组
     */
    function arr2obj($arr)
    {
        return json_decode(json_encode($arr, 320), null, 512, JSON_BIGINT_AS_STRING);
    }
}

// 数据转成树形结构
if (!function_exists('data_tree')) {
    function data_tree($data, $pid = 0, $parent_field = 'parent_id')
    {
        $tree = [];
        foreach ($data as $v) {
            if ($v[$parent_field] === $pid) {
                $_tmp = data_tree($data, $v['id'], $parent_field);
                if ($_tmp) {
                    $v['children'] = $_tmp;
                }
                $tree[] = $v;
            }
        }
        return json_decode(json_encode($tree), true, 512, JSON_BIGINT_AS_STRING);
    }
}

/**
 * 多维数组中找出对应 ID 值的元素
 *
 * @param array  $data              待搜索数组
 * @param string $key               要对比搜索的索引
 * @param string $val               要寻找的值
 * @param string children_field     子级 key
 *
 * @fixed by Xinpow 2022/11/07
 *
 * @return array
 */
if (!function_exists('array_select')) {
    function array_select($data, $key, $val, $children_field = 'children'): array
    {
        // 判断是否列表类数组
        $numIndex = true;
        collect($data)->keys()->map(function ($item) use (&$numIndex) {
            if (!is_numeric($item)) {
                $numIndex = false;
            }
        });
        if (!$numIndex) {
            $data = [$data];
        }
        $result = [];
        $recursion = function (&$result, $data, $key, $val, $children_field) use (&$recursion) {
            foreach ($data as $v) {
                if (($v[$key] ?? false) == $val) {
                    $result = $v;
                    break;
                } else if ($v[$children_field] ?? false) {
                    $recursion($result, $v[$children_field], $key, $val, $children_field);
                }
            }
        };
        $recursion($result, $data, $key, $val, $children_field);
        return $result;
    }
}

// 提取数组中对应 key 的元素集合(包含内部子元素的 key),一般用于获得元素内包含子元素在内的所有 key 集合
if (!function_exists('array_key_get')) {
    function array_key_get($arr, $key, $children_field = 'children')
    {
        if (!$arr) return null;
        // 强制转成数组
        $arr = json_decode(json_encode($arr), 1, 512, JSON_BIGINT_AS_STRING);
        foreach ($arr as $k => $v) {
            if (isset($v[$children_field]) && $v[$children_field]) {
                $result = array_key_get($v[$children_field], $key, $children_field);
            }
            $result[] = $v[$key];
        }
        return $result;
    }
}

if (!function_exists('limit')) {
    /**
     * 数据库查询统一限制列表输出数量
     *
     * @param integer $default_limit 显示数量
     * @return int
     */
    function limit($default_limit = 20): int
    {
        return request()->filled('limit') ? request()->limit : $default_limit;
    }
}